package is.ru.honn.rupin.service;

import is.ru.honn.rupin.domain.*;

import java.util.ArrayList;
import java.util.List;

public class PinServiceStub implements PinService
{
    /**
     * Breytur sem PinServiceStub þarf að nota
     */
    protected List<Board> boards = new ArrayList<Board>();
    protected List<User> users = new ArrayList<User>();
    // Breytur end

    /**
     * Fall sem býr til nýjan User og skráir hann lista
     * @param username
     * @param firstName
     * @param lastName
     * @param email
     * @param password
     * @param gender
     * @return Notanda sem verið var að búa til
     * @throws UsernameExistsException
     */
    public User signUpUser(String username, String firstName, String lastName, String email,
                             String password, Gender gender)
           throws UsernameExistsException
    {
        if(getUser(username) != null)
          throw new UsernameExistsException("Notandi er þegar til");
        User newUser = new User(username, firstName, lastName, email, password, gender);
        users.add(newUser);
        return newUser;
    }

    /**
     * Fall sem sækir notanda með notandanafn "username" úr lista
     * @param username
     * @return User
     */
    public User getUser(String username)
    {
        for(User u : users)
        {
          if (u.getUsername().equals(username))
            return u;
        }
        return null;
    }

    /**
     * Fall sem býr til nýtt borð og skráir það í lista
     * @param username
     * @param name
     * @param category
     * @return borð sem verið var að búa til
     * @throws UserNotFoundException
     */
    public Board createBoard(String username, String name, String category)
          throws UserNotFoundException
    {
        User user = getUser(username);
        if(user == null)
          throw new UserNotFoundException();

        Board newBoard = new Board(name, category);

        newBoard.setCreator(user);
        boards.add(newBoard);
        return newBoard;
    }

    /**
     * Fall sem býr til Pin sem tengist vissu borði og notanda og skráir það í lista
     * @param username
     * @param boardname
     * @param link
     * @param description
     * @return pin sem verið var að búa til
     * @throws BoardNotFoundException
     */
      public Pin createPin(String username, String boardname, String link, String description) throws BoardNotFoundException
      {
        Pin newPin = new Pin();
        Board b = getBoard(username, boardname);
        if(null == b)
          throw new BoardNotFoundException("Board does not exist");
        newPin.setBoard(b);
        newPin.setLink(link);
        newPin.setDescription(description);
        newPin.setCreator(b.getCreator());
        b.addPin(newPin);
        return newPin;
      }

    /**
     * Fall sen sækir borð tengd notanda "username" og boardname "boardname" úr lista
     * @param username
     * @param boardname
     * @return Borðið
     */
      public Board getBoard(String username, String boardname)
      {
        List<Board> userBoards = getBoards(username);
        for(Board b : userBoards)
        {
          if(b.getName().equals(boardname)) return b;
        }
        return null;
      }

    /**
     * Fall sem sækir öll borð sem tengjast notanda með notandanafn "username"  úr lista
     * @param username
     * @return Lista af borðum tengd notanda
     */
      public List<Board> getBoards(String username)
      {
        List<Board> userBoards = new ArrayList<Board>();
        for(Board b : boards)
        {
          if(b.getCreator().getUsername().equals(username))
            userBoards.add(b);
        }
        return userBoards;
      }

    /**
     * Fall sem sækir öll pins sem eru á borði sem tengist notanada með notandanafn "username"
     * og er með nafni "boardname" í lista
     * @param username
     * @param boardname
     * @return Lista af pinnum
     */
      public List<Pin> getPinsOnBoard(String username, String boardname)
      {
        List<Pin> pinsOnBoard = new ArrayList<Pin>();
        Board b = getBoard(username, boardname);
        return b.getPins();
      }
}
